<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

</head>

<body>

    <div class="a"></div>

    <script>

        // 假如封装了一个函数，这个函数有多个参数
        //    有一些参数可以提前写好的，有一部分参数需要再函数调用的时候才能使用


        // sum(1,2,3)    性能上说   高

        // sum(1)(2)(3)            低


        // function sum(a , b , c) {
        //     return a + b + c
        // }


        // sum(1,2,3) ;
        // sum(1)(2)(3) ;
        // sum(1,2)(3) ;
        // sum(1)(2,3) ;


        // function sum(...arr) {
        //     if (arr.length === 3) {   // 判断参数的个数
        //         return arr[0] + arr[1] + arr[2]
        //     }
        //     if (arr.length < 3) {
        //         return function (...arr2) {   // 第二次传参
        //             const arr3 = [...arr, ...arr2];
        //             if (arr3.length === 3) {
        //                 return arr3[0] + arr3[1] + arr3[2]
        //             }
        //             if (arr3.length < 3) {
        //                 return function (...arr4) {   // 第三次传参
        //                     const arr5 = [...arr3, ...arr4];
        //                     if (arr5.length === 3) {
        //                         return arr5[0] + arr5[1] + arr5[2]
        //                     }
        //                 }
        //             }
        //         }
        //     }
        // }

        // console.log(sum(1, 2, 3));

        // console.log(sum(1)(2, 3));

        // console.log(sum(1, 2)(3));

        // console.log(sum(1)(2));


        function sum(a, b, c) {
            return a + b + c
        }

        // console.log(sum.length);   // 函数的长度指的是形参的个数


        // cb就是我们需要柯里化的函数
        // 后面的参数时给这个cb当参数的  
        function carry(cb, ...arr) {
            let len = cb.length;   // 需要判断这个柯里化函数的 参数的个数
            if (arr.length === len) {
                return cb(...arr);
            }
            // 说明参数不够  返回函数接受剩余的参数
            return function (...arr2) {
                const arr3 = [...arr, ...arr2];
                if (arr3.length === len) {
                    return cb(...arr3)
                }
                // 如果参数继续不够，就重复调用函数自己
                return carry(cb, ...arr3)
            }
        }



        console.log(carry(sum, 1, 2, 3));

        console.log(carry(sum, 1)(2, 3));

        console.log(carry(sum, 1)(2)(3));


        function add(a, b, c, d) {
            return a + b + c + d
        }


        console.log(carry(add, 1, 2)(3, 4));


        const res = carry(add, 1, 2, 3);

        console.log(res(4));


        console.log(carry(add, 1)(2)(3, 4));


    </script>

</body>

</html>